// 数组类型
// 在元素类型后面加上[]
let arr1: (number | string | boolean)[] = [1, 2, "5"];
// 或者使用数组泛型 Array<T> 泛型只有一个数据类型
let arr2: Array<number> = [1, 2];
let arr3: Array<string> = ["1", '8889999', '412'];
console.log(arr3);

// 使用数组的索引访问来访问数据每一个数据类型
type ase2 = (typeof arrs)
type ase = (typeof arr3)[number];

const arrs = [1, 5];
type asee<T> = T extends Array<infer U> ? U : never; //可以改写为
type asee2<T> = T extends (infer U)[] ? U : never;
type aee = asee2<typeof arrs>;


// 使用接口定义数组
// 采用这种方式声明数组，就不能使用各种数组方法以及length属性，因为类型里面没有定义这些东西。
interface IArrayGoods<T> {
    // index代表数组的下标为number:值为任意一个  for example  [1,2,'zks',{name:'ljs'}]
    // [index:number]:string|number|object
    [index: number]: T; //索引签名
}

const az: IArrayGoods<number> = [1, 2];
// console.log(az.length 报错);

const goods: IArrayGoods<
    | number
    | string
    | {
    name: string;
    price: number;
}
> = [1, 2, 3, "zks", {name: "苹果", price: 85}];


interface pop<T> {
    name: string;
    children: T[];
}

const kdsa: pop<string> = {
    name: "zks",
    children: ["2"],
};

// 只读数组 利用const声明
const arr = [1, 2, 3, 34] as const;


const arrr2: readonly number[] = [1, 2, 3, 34];
const arrr3: ReadonlyArray<number> = [1, 2, 3, 34];

// arr.push('5')//报错
export default "";


type sdasrd = (string | number) []
type sdasrd2 = string | number []


type sdasrd3 = [string | number] //这是一个长度为1的元祖


// ArrayLike 定义
// 在 TypeScript 的标准库中，ArrayLike 定义如下：


// interface ArrayLike<T> {
//     readonly length: number;
//     [n: number]: T;
// }


let data: ArrayLike<number> = [1, 2, 3];
